#include "check.h"


using namespace std;

bool flag(char temp)    //判断字符是否为运算符
{
    if(temp == '+'||temp == '-'||temp == '*'||temp=='/'||temp == '.')
        return true;
    else
        return false;
}

bool check(QString labl_temp)  //表达式检查函数
{
    string temp = labl_temp.toStdString();
    if(temp == "")
        return false;
/****************括号检查***********************/
    int leftCount = 0;   //记录括号个数
    int rightCount = 0;
    int leftFlag = 0;
    for(size_t i = 0; i < temp.size();i++ )
    {
        if(temp[i]=='(')
        {
            if(temp[i+1] == ')') //检查"()"情况
                return false;
            if(i>0&&!flag(temp[i-1])) //检查除首字符左括号前无运算符
                return false;
            leftCount++;
            leftFlag++;
        }
        if(temp[i] == ')')    //出现右括号，左括号与之匹配，未匹配左括号数减一
            leftFlag--;
        if(leftFlag < 0)   //先出现右括号
            return false;
    }
    for(size_t i = 0; i < temp.size();i++ )
    {
        if(temp[i]==')')
            rightCount++;
    }
    if(leftCount != rightCount) //检查左右括号数是否匹配
        return false;
/*****************运算符及小数点检查**********************/
    for(size_t i = 0;i<temp.size() - 1;i++)
    {
        if(flag(temp[i]) && flag(temp[i+1]))  //检查连续运算符错误表达式
            return false;
        if(temp[i] == '(' && (temp[i+1] == '*' || temp[i+1] == '/')) //检查 “（*” 和“（/”错误表达式
            return false;
        if(flag(temp[i]) && temp[i+1] == ')')  //检查类似 “+）”错误表达式
            return false;
    }
    if(temp[0] == '*' || temp[0] == '/' ||flag(temp[temp.size() - 1]))  //检查首和尾部尾运算符
    {
            return false;
    }
    return true;
}
/**************正负号检查**********/
bool checkSignal(QString labl_temp)
{
    string temp = labl_temp.toStdString();
    for(size_t i = 0; i<temp.size() - 1;i++)
    {
        //检查首字符为正负号或左括号后为正负号
        if((temp[0] == '-'||temp[0] == '+')||(temp[i] == '(' && (temp[i+1] == '-' || temp[i+1] == '+')))
            return false;
    }
    return true;
}

/************插入函数（使算法支持带正负号表达式）*********/
QString insert_zero(QString temp)
{
    QString str = temp;
    if(temp[0] == '-') //首字符为负号，加上前导0
    {
        str = "0";
        str += temp;
    }
    else if(temp[0] == '+') //首字符为正号，去除正号
    {
        str = temp;
        str = str.right(str.size() - 1);
    }
    for(int i = 0;i < str.size() - 1;i++) //遍历文本
    {
        QString str2 = str;
        if(str[i] == '(' && str[i+1] == '-')
        {
            //左括号后为负号，加上前导0
            str2 = str.mid(0,i + 1);
            str2 += "0";
            str2 += str.mid(i+1,str.size()-(i+1));
        }
        else if(str[i] == '(' && str[i+1] == '+')
        {
            //左括号后为正号，去除正号
            str2 = str.mid(0,i + 1);
            str2 += str.mid(i+2,str.size()-(i+2));
        }
        str = str2;
    }
    return str;  //返回修改后表达式
}





